MIUI security components.apk(点击下载) / AntiDefraudAppManager.java


package com.miui.guardprovider.engine.mi.antidefraud;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import com.miui.guardprovider.GuardApplication;
import com.miui.guardprovider.d.b;
import com.miui.guardprovider.engine.mi.antivirus.NetworkApiHelper;
import com.xiaomi.onetrack.OneTrack;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;

public class AntiDefraudAppManager {
    private static final boolean DEBUG = GuardApplication.c;
    private static final String DETECT_APPS_URL = "https://flash.sec.miui.com/detect/app";
    private static final String MIUI_VERSION = ("MIUI-" + Build.VERSION.INCREMENTAL);
    private static final String SALT_FLASH = "6988567a-4220-4b51-bc2d-ccdec27a74a1";
    private static final String TAG = "AntiDefraudAppManager";

    private AntiDefraudAppManager() {
    }

    public static String[] getAllDetectUnsafeApps() {
        try {
            String allUnSystemAppsStatus = getAllUnSystemAppsStatus(getUnSystemAppList(GuardApplication.d));
            if (TextUtils.isEmpty(allUnSystemAppsStatus)) {
                return new String[0];
            }
            MiDetectAppsManager.getInstance(GuardApplication.d).saveDetectApps(allUnSystemAppsStatus);
            JSONObject jSONObject = new JSONObject(allUnSystemAppsStatus);
            if (jSONObject.has("error_code")) {
                if (DEBUG) {
                    Log.d("TAG", "error_code: " + jSONObject.getInt("error_code"));
                }
                return new String[0];
            }
            JSONArray optJSONArray = jSONObject.optJSONArray("data");
            ArrayList arrayList = new ArrayList();
            if (optJSONArray != null) {
                for (int i = 0; i < optJSONArray.length(); i++) {
                    JSONObject optJSONObject = optJSONArray.optJSONObject(i);
                    if (optJSONObject != null) {
                        if (optJSONObject.optInt("basisOf") == 2) {
                            arrayList.add(optJSONObject.optString(OneTrack.Param.PKG));
                        }
                    }
                }
            }
            String[] strArr = new String[arrayList.size()];
            for (int i2 = 0; i2 < arrayList.size(); i2++) {
                strArr[i2] = (String) arrayList.get(i2);
            }
            return strArr;
        } catch (Exception e) {
            Log.e(TAG, "getAllDetectUnsafeApps error, ", e);
            return new String[0];
        }
    }

    public static String getAllUnSystemAppsStatus(List<AntiDefraudAppInfo> list) {
        try {
            JSONObject jSONObject = new JSONObject();
            jSONObject.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
            jSONObject.put("os", MIUI_VERSION);
            jSONObject.put("biz_id", "virus_scan");
            jSONObject.put("uuid", b.a());
            JSONArray jSONArray = new JSONArray();
            for (int i = 0; i < list.size(); i++) {
                JSONObject jSONObject2 = new JSONObject();
                AntiDefraudAppInfo antiDefraudAppInfo = list.get(i);
                jSONObject2.put(OneTrack.Param.PKG, antiDefraudAppInfo.getPkgName());
                jSONObject2.put("version", antiDefraudAppInfo.getVersion());
                jSONObject2.put("signature", antiDefraudAppInfo.getSign());
                jSONObject2.put("appname", antiDefraudAppInfo.getAppName());
                jSONArray.put(jSONObject2);
            }
            jSONObject.put("content", jSONArray);
            String doPost = NetworkApiHelper.doPost(GuardApplication.d, DETECT_APPS_URL, jSONObject, SALT_FLASH);
            if (DEBUG) {
                Log.w("TAG", "responseDetectApp get: " + doPost);
            }
            return doPost;
        } catch (Exception e) {
            Log.e(TAG, "getAllUnSystemAppsStatus error, ", e);
            return null;
        }
    }

    public static String getDetectUnsafeAppStatus(String str) {
        if (MiDetectAppsManager.getInstance(GuardApplication.d).virusInMiEngineRiskList(str)) {
            return str;
        }
        return null;
    }

    public static String getMessageDigest(byte[] bArr) {
        char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            MessageDigest instance = MessageDigest.getInstance("MD5");
            instance.update(bArr);
            byte[] digest = instance.digest();
            int length = digest.length;
            char[] cArr2 = new char[(length * 2)];
            int i = 0;
            for (byte b2 : digest) {
                int i2 = i + 1;
                cArr2[i] = cArr[(b2 >>> 4) & 15];
                i = i2 + 1;
                cArr2[i2] = cArr[b2 & 15];
            }
            return new String(cArr2);
        } catch (Exception e) {
            Log.e(TAG, "getMessageDigest error, ", e);
            return null;
        }
    }

    private static Signature[] getRawSignature(Context context, String str) {
        if (!(str == null || str.length() == 0)) {
            try {
                PackageInfo packageInfo = context.getPackageManager().getPackageInfo(str, 64);
                if (packageInfo == null) {
                    return null;
                }
                return packageInfo.signatures;
            } catch (PackageManager.NameNotFoundException e) {
                Log.e(TAG, "getRawSignature error, ", e);
            }
        }
        return null;
    }

    public static String getSign(Context context, String str) {
        Signature[] rawSignature = getRawSignature(context, str);
        if (rawSignature == null || rawSignature.length == 0) {
            return null;
        }
        return getMessageDigest(rawSignature[0].toByteArray());
    }

    public static List<AntiDefraudAppInfo> getUnSystemAppList(Context context) {
        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
        ArrayList arrayList = new ArrayList();
        for (PackageInfo packageInfo : installedPackages) {
            if ((packageInfo.applicationInfo.flags & 1) != 1) {
                String str = packageInfo.packageName;
                AntiDefraudAppInfo antiDefraudAppInfo = new AntiDefraudAppInfo();
                antiDefraudAppInfo.setPkgName(str);
                antiDefraudAppInfo.setVersion(String.valueOf(packageInfo.versionCode));
                antiDefraudAppInfo.setSign(getSign(context, str));
                try {
                    antiDefraudAppInfo.setAppName(URLEncoder.encode(packageInfo.applicationInfo.loadLabel(packageManager).toString(), "UTF-8"));
                } catch (Exception e) {
                    Log.e(TAG, "getUnSystemAppList error, ", e);
                }
                arrayList.add(antiDefraudAppInfo);
            }
        }
        return arrayList;
    }

    public static void updateAllDetectApps(Context context) {
        try {
            String allUnSystemAppsStatus = getAllUnSystemAppsStatus(getUnSystemAppList(GuardApplication.d));
            if (!TextUtils.isEmpty(allUnSystemAppsStatus)) {
                MiDetectAppsManager.getInstance(context).saveDetectApps(allUnSystemAppsStatus);
            }
        } catch (Exception e) {
            Log.e(TAG, "updateAllDetectApps error, ", e);
        }
    }
}